#pragma once

#include "../im.h"

class IMSession : public std::enable_shared_from_this<IMSession>
{
public:
    IMSession(tcp::socket socket);
    ~IMSession(){
        // 正常关闭 不确定需不需要发送
        // boost::system::error_code ec;
        // if (socket_.is_open())
        //     socket_.close();
    };
    void start();

    void send(const msg_type &t, const char *data, const size_t &len);

    std::string getToken() const { return token_; }

private:
    void do_read();

    void do_write();

    inline void do_close(); // 发生错误关闭

    size_t get_header_leagth(std::iostream &ios)
    {
        size_t header_length = 0;
        ios.read((char *)&header_length, sizeof(size_t));
        return header_length;
    }

    void dev_message(std::iostream &ios);
    // 心跳
    void onHeartbeat(std::iostream &ios);
    // 注册
    void onRegister(std::iostream &ios);
    // 登录
    void onLogin(std::iostream &ios);
    // 获取好友列表
    void onFriendList(std::iostream &ios);
    // 查找用户
    void onFinduser(std::iostream &ios);
    enum
    {
        max_length = 1024
    };
    char data_[max_length];
    tcp::socket socket_;
    boost::asio::streambuf sb_;
    std::queue<std::unique_ptr<boost::asio::streambuf>> message_queue_;
    bool is_writing_ = false;
    std::string token_;
};

typedef std::shared_ptr<IMSession> IMSessionPtr;